﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using StructureMap;

namespace WebApp.Bootstrap.StructureMap
{
    /// <summary>
    /// 在Asp.net MVC 3以后,添加了IDependencyResolver接口,用于IOC容器
    /// 设置此后可以不用像3以前更改DefaultControllerFactory来注入
    /// </summary>
    /// <example>
    /// DependencyResolver.SetResolver(new StructureMapResolver(ObjectFactory.Container));
    /// </example>
    public class StructureMapResolver : IDependencyResolver
    {
        private readonly IContainer _container = null;

        public StructureMapResolver(IContainer container)
        {
            _container = container;
        }

        public object GetService(Type serviceType)
        {
            try
            {
                if (serviceType.IsAbstract || serviceType.IsInterface)
                {
                    return _container.TryGetInstance(serviceType);
                }
                else
                {
                    return _container.GetInstance(serviceType);
                }
            }
            catch
            {
                ///按微软的要求，此方法，在没有解析到任何对象的情况下，必须返回 null，必须这么做！！！！
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return _container.GetAllInstances(serviceType).Cast<object>();
            }
            catch
            {
                ///按微软的要求，此方法，在没有解析到任何对象的情况下，必须返回空集合，必须这么做！！！！
                return new List<object>();
            }
        }
    }
}